<?php
/**
 * Created by PhpStorm.
 * User: yuanxr
 * Date: 2018/6/10
 * Time: 上午8:32
 */
namespace Utility\Data;
use Utility\Extend\EString;
/**********************************************************************************************************************
 * 实用数据工具
 *
 * 1、sql：用于快速编写sql语句
 * 2、data：用于快速获取复杂数据（比如分页和瀑布流）
 * 3、timeline：报表时间线生成类
 * 4、mysql：mysql数据库操作类
 **********************************************************************************************************************/
/**********************************************************************************************************************
 * /sql：用于快速编写sql语句，特别是where子句
 **********************************************************************************************************************/
class Sql
{
    //设置实例化字符串类
    private $_EString;

    function __construct(){
        $this->_EString = new EString();
    }
    /**
     * where
     *
     * @param array $config 配置数组，示例：
     * $where = [
     *   ['id', '=', get('id')],
     *   ['age', '=', get('age')],
     *   ['name', 'like', get('name')],
     *   ['pid', 'in', [1,2,3,4]]
     * ];
     * @return array 数组，元素0为where子句，元素1为对应的参数数组：
     * [
     *   0 => $where,
     *   1 => $params
     * ]
     */
    public function where(array $config)
    {
        // 声明返回使用的2个数组
        $wheres = [];
        $params = [];

        // 遍历config，循环将有值的字段添加到where, param
        foreach ($config as $k=>$v) {

            // 将$v进行分解
            $config = $v[0];
            $operation = $v[1];
            $value = $v[2];

            // 如果value为空值或空串，则跳出此循环
            if (!$value) {
                break;
            }

            // like语句时的处理（like语句时，必须将%%符号写到参数值中）
            if ($operation == 'like') {
                $wheres[] = $config . ' ' . $operation . ' ?';
                $params[] = '%' . $value . '%';
            }

            // in语句时的处理(in语句时，不能使用参数，只能直接赋值)
            elseif ($operation == 'in') {
                $value = is_array($value) ? $value : [$value];
                $wheres[] = $config . ' ' . $operation . '(' . $this->_EString->join($value, ',') . ')';
            }

            // 正常语句时的处理
            else {
                $wheres[] = $config . $operation . '?';
                $params[] = $value;
            }
        }
        // 组合wheres成为语句
        $where = $this->_EString->join($wheres, ' and ');
        // 返回
        return [$where, $params];
    }
}